{
 "metadata": {
  "name": "cython_gsl_siam_talk"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Fast Numerical Computing with CythonGSL"
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "Thomas Wiecki"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "About me\n",
      "--------\n",
      "\n",
      "* PhD student at Brown University\n",
      "    * Bayesian Statistics\n",
      "    * Computational Cognitive Neuroscience\n",
      "* Quantitative Researcher at Quantopian Inc. (http://www.quantopian.com)\n",
      "    * Building a free web-platform that allows you to build your own algorithmic trading strategy in Python and test it online.\n",
      "* Twitter: @twiecki\n",
      "* Github: twiecki\n",
      "* email: thomas.wiecki@gmail.com"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Python for Numerical Computing\n",
      "------------------------------\n",
      "\n",
      "* Python is a great high-level language.\n",
      "* As we all know, too slow for numerical computations.\n",
      "* Several approaches exist to leverage this problem:\n",
      "    * NumPy: Speed gain when expressing problem as matrix algebra.\n",
      "    * Cython: Python-like language that compiles to fast C.\n",
      "    * CythonGSL: Cython interface to the Gnu Scientific Library.\n",
      "    * Many more (Numba, PyPy, PyCUDA, Theano...)"
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Illustrative Example: Gibbs sampling"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Compute joint probability of: \n",
      "\n",
      "$f(x,y) = k \\times x^2 \\exp(-xy^2 - y^2 + 2y - 4x)$\n",
      "\n",
      "where $k$ is a normalizing constant so that $f(x, y)$  integrates to $1$.\n",
      "\n",
      "Set $\\frac{1}{k} = \\int_Y\\int_X x^2 \\exp(-xy^2 - y^2 + 2y - 4x) dx dy$.\n",
      "\n",
      "Integration is hard. Instead, lets Gibbs sample from the conditionals:\n",
      "\n",
      "$x|y \\sim Gamma(3, y^2 +4)$\n",
      "\n",
      "$y|x \\sim Normal(\\frac{1}{1+x}, \\frac{1}{2+2x)})$"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy as np\n",
      "import matplotlib.pyplot as plt"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "x, y = np.mgrid[0:2.6:100j, -1.2:3.2:100j]\n",
      "def f(x, y):\n",
      "    return x**2 * np.exp(-x*y**2 - y**2 + 2*y - 4*x)\n",
      "\n",
      "plt.contourf(x, y, f(x, y))\n",
      "plt.xlabel('x')\n",
      "plt.ylabel('y')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 2,
       "text": [
        "<matplotlib.text.Text at 0xb779e8c>"
       ]
      },
      {
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAECCAYAAAAb5qc/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEqpJREFUeJzt3V+IVGUDx/Hf5LqKqBct7hIEKphERcqyKxsiaVfGulFo\n8QZSF3Wz2UX4ihvaGqQgmuUilUko6tVLWAvWWm4bpmJaKqGmESYWiNhevOb6p9jS8174zroz7syc\nmXnOc855nu/nynXHPc+Zmb7z9OwzZzJBEAQCADjpnrgHAACIDpEHAIcReQBwGJEHAIcReQBwWE3c\nAxguk8nEPQQASJ1imyQTFfnbTsQ9gBhtltQe9yBi5Pv5S9wHnH/55z+j6HdZrgEAhxF5AHAYkU+U\nprgHEDPfz1/iPuD8Tcsk6bIGt3/x6vOaPACUa0bRX7wykwcAh1nbXRMEgRYsWKCWlhYNDg7q3Llz\n2rZtm8aOHWtrCADgHasz+dmzZ6uzs1OrV6/WjRs39Omnn9o8PAB4x1rkM5mMVqxYIUn6559/dOHC\nBT344IO2Dg8AXrL+Zqje3l5t3LhRbW1tamxsHOEWm4f9uUlSs6WRAUAaHJV0LPStY9td8+KLL6ql\npUXt7Xfe3cXuGgAoV0J21/z000/as2fP0NdTpkzR+fPnbR0eALxkbblmzJgx2rp1q3744Qf9/fff\n+vnnn7Vp0yZbhwcAL/FmKABItYQs1wAA7CPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAw\nIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8A\nDiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPy\nAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADiPyAOAwIg8ADquxdaBz586ps7NTjY2N\nunDhgurq6tTZ2Wnr8ADgJWuRv3z5sp5//nm1tbVJkh5++GG1traqsbHR1hAAwDvWIt/U1JTz9a1b\ntzR+/PgRbrl5+L+S1BzlsAAgZY5KOhb61pkgCILoBjOy7u5uHThwQBs3bswdTCYj6YTt4QBAis1Q\nsYxbm8ln7du3T/v371dXV5ftQwOAd6zurunp6VFvb6+6urp08eJFHTlyxObhAcA71pZrjh8/rrlz\n56q5uVlBEOj69et69dVX9cILL9wZjM3lmn89Wtm/+89Js+MAgKoUX66JZU2+ECuRrzTuxRB+ALEh\n8rdFEfdCiD4Aa3yPvM24j4TgA4iUz5GPO/D5CD4A43yNfNICn4/gAzDCx8gnPfD5CD6AiiXszVAY\nwfAXJYIPwCD3ZvJpm8UXQuwBhOLTco0rgc9H8AEUxHJN+rGcA6BC7szkXZ3FF0LsAUhiJu8qZvcA\nQnBjJh/BLL72/YGi3x9cMtH4MatG7AEP+fCL1yojXyro5UhM/Ak+4AkiX5DJuBcSe/SJPeA41yNf\nQeBtxL2Q2KJP7AFHEfkccQY+H8EHUD0iPyRJgc8XS/CJPeAAlyPvSODzWQ8+sQdSjMinKvD5CD6A\n4jyPfJoDPxyxBzAy3vHqhOEvVlaCn30BJfZAqjk9k692Ft9x77qy/826/3ZUdcxyMLsH4O5yTURL\nNZWEvRQb4bcafGIPJIinkS838FHEvZAoo0/sAd8Q+aJsxn0kUQWf2AO+8DDyaQl8PoIPoHxEfkRJ\nC3y+KIJP7AEXEfm7JD3w+UwHn9gDLvEs8q4FfjhiD+BuLkY+xln8spsbSt5mw6hlVR0jDIIP4DYi\nP6SSwIeJelhRxJ/YA74j8kPKibzJuBdiOvomg0/sgbTwKPImAm8j7iMxGXxiD/iEyEsKF/m4Ap/P\nVPCJPeADIp+qwOczEXxiD7iMyJeMfFIDPxyxBzCy4pG/x+JIUIVlNzdU/WLUce86Y+8TqH1/wN4H\nsvzr0bI/sB3Abc7M5OOexU/sGBz688C6WiM/s5RqZ/fM7AEXeLJcU0nkKw388KBXwvSLgLexlwg+\nQOTNRL7asBdiMvjEHvARkR/x75MQ+Hymgk/sAZ+4FnlDO2vCRt5W4POZCL63sSf08IrHka92qSau\nwOerNvhJiT2zeiAKFW6h3L17t/GhXLp0SS+//LJmzZpl/GeXI02Bl26PpZrxVLv9MpXbLiW2XgIq\nEvnVq1dr+fLlOn36tLGDHTp0SE8//XTRV50kSFLghzMR+0qldo+9ROzhtZpC39ixY4cmT56sHTt2\n6IMPPtD8+fPV1tZW1cEWLlyob775psStNg/7c5Ok5qqO6aJs6CtZxsmGvtIlnGzoTSzhZENvbRkn\nG3qWcZBqRyUdC33rgpG/deuWampqNGbMGB06dEjnz59Xb2+v5syZo+eee87ESAtoj/Bnl5bUWfxI\n4o69qbX62vcH7K7XE3ukWrNyJ78fFr11wcgvXrxYAwMDam1t1ccff6zp06dLkpYvXx5x5NPr5Dvh\nbvfov80ed2LHYMW/nF12c4Ofs3qJ2MMLBSM/ffp0bd26VRMmTBj6u8HBQf35559WBhaVYuvSlc7i\nw8a90O1NRN+lWb0UQ+wJPRxVcAvlzZs3NWrUKKMHO3DggHbu3Km9e/eqvb1dS5cu1dixY+8MxsIW\nSpORLzfupZic4Vc6s0/Kdksphi2XErFHCrFPPoepyJsOfD4Twa9mf301sU/1585mEXukBpcaNi7q\nwGePUe1xqtlymZTtllLxT/yKDFsu4Qgin3AmXlDiCL1k7k1UUoyhJ/ZIOSJfJhuz+JGOaWJWX4mk\nvFtWiuFNVFmEHilG5P8vDfvj4wq9xPINs3qkFZFPmbSGXnJg+UYi9EgdIl+GOJZqRlLt8o1LoWdW\nDxRH5FOM0N/GrB4oLH2Rj2j/sq0P304SQm8AoUfCpS/yyMEa/R2xhp7YI6GIfBlMX1jMlDhDXy1n\nQi8ReiSSd5Gv9tosyFXtbD4KhB64w7vIu4plm1yEHriNyCMRogh9rAg9EoLIDxNmh01S1+VNiHM2\nH4VYZ/MSoUciOB1505e8RbScW7aRCD1i50zkbV5z3OXZPAC3OBP5crDDJhomlmyYzQNmeRn5YsK+\n85XZPMpC6BETIl+FJIU+SWNJothn80BMnI98oV++FluyKec6NsQVoTGbRwycj7wNcYfe1PF9vEgb\n4Lp0Rr7AlShN7rApN3hxhP7Rf8f/AjMcv9AGkiedkS9TJUs2UmWhtxVd08dhFm8JSzawrCbuAbgo\nG+AoPkkqSTN3AMnnfeQ3jFpWdH/3wLrait/uPzzI1QQ/6rCbmMWzVAMkkzeRX/ffjorfaFNN6LOS\nOgNP2jINl6IAzHJuTb6SX76GmYUmLYYmmDonZvFAcjkX+Ur5FPqBdbWJDHyUs3ib1zYCkiS9ka/g\nA71NRMRkIONgcuzM4CsQ0QfRA4WkN/JFVDprKydaaQu96Rcn04FnFg9Ew8nIF1MqJuWGPumxj2KM\naQo84DtvdteUo9S2ynzZiFa7A8eUqF54olieiTrwiZrFs1SDGGSCIAjiHkRWJpORdCL8Pyjx7sFi\nVx4Ms52ymuuj2w5+1P9HQeANIPKIxAwVy3i6Iy8VDX2py8tGHfrhTEbf5hJRGuMuEXj4pHjkWa4p\nodylm0KSvnafL6qdMwQesMvpmbxkZjafZWpWn2RRbosk8EAUPF6ukcJ9IpDvoY96v7uXcZcIPCxx\nPfKS9dBLbsTehbhLBB6+I/KhP9+zkguYpSn2tt6hanPfO4EHiLykaEOflcTg27z0gPdxlwg8YkDk\nh9gI/XC2ox/XtWSIu4g7YuRD5CWjs3nJXOjzVRv+pFwUzPalCBIbd4nAI2ZEPkc5oZeii30axXGN\nGeIOlJKgyPf19am7u1v19fXKZDJatWpV7mCqibxE6CMQ18XDiDsQVkIif+PGDc2YMUNnzpzR6NGj\ntWjRIr3yyit64okn7gzGUuSl8kMv+RP7OK8Kmei4SwQeCZSQyxocPnxYkydP1ujRoyVJs2fPVk9P\nT07kb9s87M9NkpptDbGkbPxci33cl/pNfNgl4o4EOSrpWOhbW4t8f3+/JkyYMPT1xIkT1d/fP8It\n2ys/yH9Ohp7NDy6ZWNFsXsqNYhqDH3fUs4g7UIlm5U5+Pyx6a2uRb2ho0NWrV4e+vnLlihoaGmwd\nfkTVhD4r6cFPStCzCDtgl/U1+dOnT6u2tlaLFi3SkiVLNG/evDuDqXZNPquMtfmsamNfiI3wJy3k\n+VIRdom4I6US8otX6fbuml27dmnSpEmqra1VZ2dn7mBijLwUXeh9lJqwS8QdKZegyJdiLPISoY8B\nYQfikJDdNWmRDRWxLy1VUc8i7vCMuzN5qeLZ/HDE/o5URl0i7HCcr8s1WQZCL/kZ+9RGXSLs8AjL\nNUa4voyT6qBnEXbgLu7P5CVjs/l8aQ2+E0HPIuzwnu/LNVkRhX64JEXfqZDnI+zAMET+DguhL8bE\ni4DT8S6EqANFEPlcMYceIRF2ICQifzdCnzxEHagQkR8ZoY8XUQcMIfLFEXs7iDoQESJfGqE3j6gD\nlhD58Ih9ZQg6ECMiXz5iXxhBBxKGyFfO99gTdCAFiLwZLgefmAMpRuTNS2vwiTngICJvRxLCT8QB\nDxH5ZCr0okCoAZSFyAOAw4pH/h6LIwEAWEbkAcBhRB4AHEbkAcBhRB4AHEbkAcBhRB4AHEbkAcBh\nRB4AHEbkAcBhRB4AHEbkAcBhRB4AHEbkAcBhRB4AHEbkAcBhRB4AHEbkAcBhRB4AHEbkAcBhRB4A\nHEbkAcBh1iIfBIG2bNmihoYGnTlzxtZhAcBr1iJ/4sQJtbS0aNy4cbYOCQDeq7F1oJkzZ9o6FADg\n/4xGfv78+fr999/v+vu33npLbW1tIX/K5mF/bpLUbGJoAOCIo5KOhb610ch/+eWXBn5Ku4GfAQCu\nalbu5PfDoreOZXdNEARxHBYAvGMt8n/88YfWrFmjgYEBffTRR/ruu+9sHRoAvJUJEjStzmQykk7E\nPQwASJEZRVdHeDMUADiMyCfK0bgHEDPfz1/iPuD8TSPyiRJ+W5SbfD9/ifuA8zeNyAOAw4g8ADgs\ngbtrAADlKJZxa9euCSNBrzcA4ASWawDAYUQeABxG5AHAYbGsyff19am7u1v19fXKZDJatWpVzvf/\n+usvLVu2TPfff7/Onj2r119/XQ888EAcQ41EqfPfvn27tmzZorFjx0qSXnrpJS1evDiOoUbi0qVL\neuONN3Ty5El9//33d33f9ce/1Pm7/vifO3dOnZ2damxs1IULF1RXV6fOzs6c27j+HAhzHxh7HgSW\nXb9+PZg2bVowODgYBEEQLFy4MPj6669zbrN27drg7bffDoIgCE6dOhXMmTPH9jAjE+b8t2/fHvz6\n669xDM+KXbt2BZ999lnQ1NQ04vddfvyDoPT5u/74Hz16NNi9e/fQ1w899FBw/PjxnNu4/hwIcx+Y\neh5YX645fPiwJk+erNGjR0uSZs+erZ6enpzb7NmzR4899pgk6ZFHHtGJEyd07do120ONRJjzl6T3\n3ntP77zzjlavXq3Lly/bHmakFi5cqPHjxxf8vsuPv1T6/CW3H/+mpqacDxG6devWXfeH68+BMPeB\nZOZ5YH25pr+/XxMmTBj6euLEierv7w91m1L/YaRBmPN//PHHtWDBAtXV1emLL77Qs88+q76+PttD\njY3Lj38YPj3+3d3dmj9/vqZPn57z9z49BwrdB6aeB9Yj39DQoKtXrw59feXKFTU0NOTcpr6+XgMD\nA0NfDwwMqL6+3toYoxTm/KdMmTL053nz5umpp55SEATevFnM5cc/DF8e/3379mn//v3q6uq663u+\nPAeK3QemngfWl2taWlr022+/aXBwUJL07bffqrW1VZcvXx6KX2trqw4fPixJOnXqlGbOnOnMK3iY\n81+xYoVu3rwpSTp79qymTp3q3H/g+Xx5/Avx7fHv6elRb2+vurq6dPHiRR05csS750Cp+8DU8yCW\nyxr09fVp165dmjRpkmpra9XZ2amOjg7de++96ujoGPrN+n333adffvlFK1eu1LRp02wPMzKFzr+u\nrk7Lly/Xpk2b9OOPP2rq1Kk6deqUXnvtNc2aNSvuYRtz4MAB7dy5U3v37lV7e7uWLl2qN99805vH\nv9D5+/L4Hz9+XHPnzlVzc7OCIND169e1ZMkSnTlzxpvnQJj7wNTzIFHXrgEAmMWboQDAYUQeABxG\n5AHAYUQeABxG5IEi1q5dq3HjxungwYN699131draqrNnz8Y9LCA0dtcAJaxZs0b9/f2qqanR2rVr\nNWbMmLiHBITGTB4oYeXKlfrqq680bdo0Ao/UYSYPlPDJJ5/o2rVrWr9+vT7//HNNnTo17iEBoTGT\nB4rYtm2b1q9fryeffFJNTU165plndPDgwbiHBYTGTB4AHMZMHgAcRuQBwGFEHgAcRuQBwGFEHgAc\nRuQBwGH/A+E1Vrs7ff0rAAAAAElFTkSuQmCC\n",
       "text": [
        "<matplotlib.figure.Figure at 0xb749d4c>"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "Pure Python version"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import random, math\n",
      "\n",
      "def gibbs_pure_python(N=20000, thin=500):\n",
      "    x = 0\n",
      "    y = 0\n",
      "    samples = []\n",
      "    \n",
      "    for i in range(N):\n",
      "        for j in range(thin):\n",
      "            x = random.gammavariate(3, 1.0 / (y**2 + 4))\n",
      "            y = random.gauss(1.0/(x+1), 1.0 / math.sqrt(2 + 2*x))\n",
      "        samples.append((x, y))\n",
      "        \n",
      "    return samples"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 3
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%timeit gibbs_pure_python()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1 loops, best of 3: 60.9 s per loop\n"
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "posterior = np.asarray(gibbs_pure_python())\n",
      "plt.hexbin(posterior[:, 0], posterior[:, 1])"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "pyout",
       "prompt_number": 5,
       "text": [
        "<matplotlib.collections.PolyCollection at 0xba9594c>"
       ]
      },
      {
       "output_type": "display_data",
       "png": "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\ns070s05j1lheOb2bDbOi/lhmtr0NnHZXutKVrnSlFdmxdGNb+DzoSle60pUfS7lptrF3pStd6UpX\nmkt30O5KV7rSlV0k3UG7K13pSld2kWx5NvbdKs899xxPPfUUExMTGGP47Gc/mzj/xBNP8Nd//dcM\nDAwA8MlPfpJf+7Vf2wlTW5IrV67wB3/wB/zoRz/i+9//fsP51dVVfvu3f5tjx47x5ptv8nu/93vc\nddddO2Bp69Ksbbv1nr399ts8/vjjPPjgg1y4cIGxsTEef/zxhM5uvW9l2rZb75u1lo9//OM88sgj\nrK+v8/bbb/O3f/u39XZAm/fNdqVBlpaW7J133mnX19ettdZ+4hOfsN/85jcTOk888YSdnJzcCfM2\nJU8++aT92te+Zh966KHM85///OftF77wBWuttadPn7Y/+7M/u53mbUqatW233rMf/OAH9qtf/Wr9\n+3333WdfeumlhM5uvW9l2rZb71scx/ZP/uRP6t9/6Zd+yX7lK19J6LRz37oz7Qx58cUXOXHiBL29\nEunvgx/8IE8//TQf/ehHE3p/+Zd/yeHDh1leXuY3fuM32L9//06Y25J84hOf4Fvf+lbu+a9//et8\n/vOfB+D+++/n5ZdfZnFxkZGRkW2ysH1p1jbYnffsoYceSnyP47jhfuzW+1ambbA775sxhs985jMA\nVKtVLly4wL333pvQaee+dQftDLl27Rqjo6P173v27OHatWsJnQ996EN8/OMfZ2xsjGeeeYZf/dVf\n5bnnnttuUzsueW2/2X/8ZeRWuGdPPfUUjz76KHfffXfi+K1w3/Lattvv27PPPssXv/hFHnvsMR58\n8MHEuXbuW/dFZIYcOnSIhYWF+ve5uTkOHTqU0Dl58iRjY2MAfOQjH+GFF164JfzSJyYmmJ+fr3+f\nn59nYmJiBy3qnOz2e/b888/zwgsv8MUvfrHh3G6/b0Vt2+337Rd+4Rd45plneOedd/irv/qrxLl2\n7lt30M6QRx55hLNnz7K+LhEAv/Od7/Cxj32MmZmZ+mD+mc98hlqtBsCbb77JqVOndu0O0LBdH/vY\nx3jxxRcBOH36NA888MCumq2l5Va5Z08//TTPPvssf/Znf8alS5f47ne/e8vct2Zt26337bXXXuPr\nX/96/fvJkyd59913N33ftnQb+26W5557jieffJLx8XH6+vp4/PHH+fSnP83Y2Bi/+7u/y1/8xV/w\nyiuvcOrUKU6fPs1v/uZv8oEPfGCnzW4q//zP/8yXv/xlvvGNb/CpT32K3/qt3+IP//APOXDgAJ/+\n9Kfrb7OPHDnCW2+9xe///u9z55137rTZpSSvbbv9nr300kt8+MMf5uGHH8Zay9LSEr/+67/OmTNn\ndv19K9O23Xrf3nnnHX7nd36HBx98kI2NDV5//XX+/M//nD/90z/d1H3rDtpd6UpXurKLpEuPdKUr\nXenKLpLuoN2VrnSlK7tIuoN2V7rSla7sIukO2l3pSle6soukO2h3pStd6couku6g3ZWudKUru0j+\nP/9fa3FqwlLiAAAAAElFTkSuQmCC\n",
       "text": [
        "<matplotlib.figure.Figure at 0xb7989cc>"
       ]
      }
     ],
     "prompt_number": 5
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "NumPy version"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import random, math, numpy\n",
      "\n",
      "def gibbs_numpy(N=20000, thin=500):\n",
      "    x = 0\n",
      "    y = 0\n",
      "    samples = np.empty((N, 2))\n",
      "    \n",
      "    for i in xrange(N):\n",
      "        for j in xrange(thin):\n",
      "            x = random.gammavariate(3, 1.0 / (y**2 + 4))\n",
      "            y = random.gauss(1.0/(x+1), 1.0 / math.sqrt(2 + 2*x))\n",
      "        samples[i, 0] = x\n",
      "        samples[j, 1] = y\n",
      "    return samples"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 6
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%timeit gibbs_numpy()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1 loops, best of 3: 60.3 s per loop\n"
       ]
      }
     ],
     "prompt_number": 7
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "Cython version"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%load_ext cythonmagic"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 5
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%cython -a\n",
      "\n",
      "import cython\n",
      "cimport cython\n",
      "\n",
      "import numpy as np\n",
      "cimport numpy as np\n",
      "\n",
      "import random\n",
      "import math\n",
      "\n",
      "from libc.math cimport sqrt\n",
      "\n",
      "@cython.boundscheck(False)\n",
      "@cython.wraparound(False)\n",
      "@cython.cdivision(True)\n",
      "def gibbs_cython(int N=20000, int thin=500):\n",
      "    cdef: \n",
      "        double x = 0\n",
      "        double y = 0\n",
      "        Py_ssize_t i, j\n",
      "        np.ndarray[np.float64_t, ndim=2] samples = np.empty((N, 2), dtype=np.float64)\n",
      "\n",
      "    for i in range(N):\n",
      "        for j in range(thin):\n",
      "            x = random.gammavariate(3, 1.0 / (y**2 + 4))\n",
      "            y = random.gauss(1.0/(x+1), 1.0 / sqrt(2 + 2*x))\n",
      "        samples[i, 0] = x\n",
      "        samples[i, 1] = y\n",
      "    return samples"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": [
        "<!-- Generated by Cython 0.16 on Fri Feb 22 18:05:16 2013 -->\n",
        "<html>\n",
        "\n",
        "<head>\n",
        "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n",
        "<style type=\"text/css\">\n",
        "\n",
        "body { font-family: courier; font-size: 12; }\n",
        "\n",
        ".code  { font-size: 9; color: #444444; display: none; margin-left: 20px; }\n",
        ".py_c_api  { color: red; }\n",
        ".py_macro_api  { color: #FF7000; }\n",
        ".pyx_c_api  { color: #FF3000; }\n",
        ".pyx_macro_api  { color: #FF7000; }\n",
        ".refnanny  { color: #FFA000; }\n",
        "\n",
        ".error_goto  { color: #FFA000; }\n",
        "\n",
        ".tag  {  }\n",
        "\n",
        ".coerce  { color: #008000; border: 1px dotted #008000 }\n",
        "\n",
        ".py_attr { color: #FF0000; font-weight: bold; }\n",
        ".c_attr  { color: #0000FF; }\n",
        "\n",
        ".py_call { color: #FF0000; font-weight: bold; }\n",
        ".c_call  { color: #0000FF; }\n",
        "\n",
        ".line { margin: 0em }\n",
        "\n",
        "</style>\n",
        "<script>\n",
        "function toggleDiv(id) {\n",
        "    theDiv = document.getElementById(id);\n",
        "    if (theDiv.style.display == 'none') theDiv.style.display = 'block';\n",
        "    else theDiv.style.display = 'none';\n",
        "}\n",
        "</script>\n",
        "</head>\n",
        "        <body>\n",
        "<p>Generated by Cython 0.16 on Fri Feb 22 18:05:16 2013\n",
        "<pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line1\")'> 1: </pre>\n",
        "<pre id='line1' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF79' onclick='toggleDiv(\"line2\")'> 2: import cython</pre>\n",
        "<pre id='line2' class='code' style='background-color: #FFFF79'>\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":2\n",
        " * \n",
        " * import cython             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " * cimport cython\n",
        " * \n",
        " */\n",
        "  __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_1));\n",
        "  if (<span class='py_c_api'>PyObject_SetAttr</span>(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
        "</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line3\")'> 3: cimport cython</pre>\n",
        "<pre id='line3' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line4\")'> 4: </pre>\n",
        "<pre id='line4' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF8d' onclick='toggleDiv(\"line5\")'> 5: import numpy as np</pre>\n",
        "<pre id='line5' class='code' style='background-color: #FFFF8d'>\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":5\n",
        " * cimport cython\n",
        " * \n",
        " * import numpy as np             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " * cimport numpy as np\n",
        " * \n",
        " */\n",
        "  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(((PyObject *)__pyx_n_s__numpy), 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
        "  if (<span class='py_c_api'>PyObject_SetAttr</span>(__pyx_m, __pyx_n_s__np, __pyx_t_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
        "</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line6\")'> 6: cimport numpy as np</pre>\n",
        "<pre id='line6' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line7\")'> 7: </pre>\n",
        "<pre id='line7' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF8d' onclick='toggleDiv(\"line8\")'> 8: import random</pre>\n",
        "<pre id='line8' class='code' style='background-color: #FFFF8d'>\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":8\n",
        " * cimport numpy as np\n",
        " * \n",
        " * import random             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " * import math\n",
        " * \n",
        " */\n",
        "  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(((PyObject *)__pyx_n_s__random), 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
        "  if (<span class='py_c_api'>PyObject_SetAttr</span>(__pyx_m, __pyx_n_s__random, __pyx_t_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
        "</pre><pre class='line' style='background-color: #FFFF8d' onclick='toggleDiv(\"line9\")'> 9: import math</pre>\n",
        "<pre id='line9' class='code' style='background-color: #FFFF8d'>\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":9\n",
        " * \n",
        " * import random\n",
        " * import math             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " * \n",
        " * from libc.math cimport sqrt\n",
        " */\n",
        "  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(((PyObject *)__pyx_n_s__math), 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
        "  if (<span class='py_c_api'>PyObject_SetAttr</span>(__pyx_m, __pyx_n_s__math, __pyx_t_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
        "</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line10\")'> 10: </pre>\n",
        "<pre id='line10' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line11\")'> 11: from libc.math cimport sqrt</pre>\n",
        "<pre id='line11' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line12\")'> 12: </pre>\n",
        "<pre id='line12' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line13\")'> 13: @cython.boundscheck(False)</pre>\n",
        "<pre id='line13' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line14\")'> 14: @cython.wraparound(False)</pre>\n",
        "<pre id='line14' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line15\")'> 15: @cython.cdivision(True)</pre>\n",
        "<pre id='line15' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF48' onclick='toggleDiv(\"line16\")'> 16: def gibbs_cython(int N=20000, int thin=500):</pre>\n",
        "<pre id='line16' class='code' style='background-color: #FFFF48'>\n",
        "/* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":16\n",
        " * @cython.wraparound(False)\n",
        " * @cython.cdivision(True)\n",
        " * def gibbs_cython(int N=20000, int thin=500):             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *     cdef:\n",
        " *         double x = 0\n",
        " */\n",
        "\n",
        "static PyObject *__pyx_pf_46_cython_magic_47aca511be1c039cbd4a474ec757e22b_gibbs_cython(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_N, int __pyx_v_thin) {\n",
        "  double __pyx_v_x;\n",
        "  double __pyx_v_y;\n",
        "  Py_ssize_t __pyx_v_i;\n",
        "  CYTHON_UNUSED Py_ssize_t __pyx_v_j;\n",
        "  PyArrayObject *__pyx_v_samples = 0;\n",
        "  __Pyx_LocalBuf_ND __pyx_pybuffernd_samples;\n",
        "  __Pyx_Buffer __pyx_pybuffer_samples;\n",
        "  PyObject *__pyx_r = NULL;\n",
        "  <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
        "  <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"gibbs_cython\", 0);\n",
        "  __pyx_pybuffer_samples.pybuffer.buf = NULL;\n",
        "  __pyx_pybuffer_samples.refcount = 0;\n",
        "  __pyx_pybuffernd_samples.data = NULL;\n",
        "  __pyx_pybuffernd_samples.rcbuffer = &__pyx_pybuffer_samples;\n",
        "\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":16\n",
        " * @cython.wraparound(False)\n",
        " * @cython.cdivision(True)\n",
        " * def gibbs_cython(int N=20000, int thin=500):             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *     cdef:\n",
        " *         double x = 0\n",
        " */\n",
        "  __pyx_k_tuple_13 = <span class='py_c_api'>PyTuple_New</span>(7);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_13);\n",
        "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_n_s__N));\n",
        "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_k_tuple_13, 0, ((PyObject *)__pyx_n_s__N));\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_n_s__N));\n",
        "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_n_s__thin));\n",
        "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_k_tuple_13, 1, ((PyObject *)__pyx_n_s__thin));\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_n_s__thin));\n",
        "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_n_s__x));\n",
        "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_k_tuple_13, 2, ((PyObject *)__pyx_n_s__x));\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_n_s__x));\n",
        "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_n_s__y));\n",
        "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_k_tuple_13, 3, ((PyObject *)__pyx_n_s__y));\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_n_s__y));\n",
        "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_n_s__i));\n",
        "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_k_tuple_13, 4, ((PyObject *)__pyx_n_s__i));\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_n_s__i));\n",
        "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_n_s__j));\n",
        "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_k_tuple_13, 5, ((PyObject *)__pyx_n_s__j));\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_n_s__j));\n",
        "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_n_s__samples));\n",
        "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_k_tuple_13, 6, ((PyObject *)__pyx_n_s__samples));\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_n_s__samples));\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_13));\n",
        "\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":16\n",
        " * @cython.wraparound(False)\n",
        " * @cython.cdivision(True)\n",
        " * def gibbs_cython(int N=20000, int thin=500):             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *     cdef:\n",
        " *         double x = 0\n",
        " */\n",
        "  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_47aca511be1c039cbd4a474ec757e22b_1gibbs_cython, NULL, __pyx_n_s_16);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
        "  if (<span class='py_c_api'>PyObject_SetAttr</span>(__pyx_m, __pyx_n_s__gibbs_cython, __pyx_t_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
        "</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line17\")'> 17:     cdef:</pre>\n",
        "<pre id='line17' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line18\")'> 18:         double x = 0</pre>\n",
        "<pre id='line18' class='code' style='background-color: #FFFFff'>\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":18\n",
        " * def gibbs_cython(int N=20000, int thin=500):\n",
        " *     cdef:\n",
        " *         double x = 0             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *         double y = 0\n",
        " *         Py_ssize_t i, j\n",
        " */\n",
        "  __pyx_v_x = 0.0;\n",
        "</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line19\")'> 19:         double y = 0</pre>\n",
        "<pre id='line19' class='code' style='background-color: #FFFFff'>\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":19\n",
        " *     cdef:\n",
        " *         double x = 0\n",
        " *         double y = 0             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *         Py_ssize_t i, j\n",
        " *         np.ndarray[np.float64_t, ndim=2] samples = np.empty((N, 2), dtype=np.float64)\n",
        " */\n",
        "  __pyx_v_y = 0.0;\n",
        "</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line20\")'> 20:         Py_ssize_t i, j</pre>\n",
        "<pre id='line20' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF24' onclick='toggleDiv(\"line21\")'> 21:         np.ndarray[np.float64_t, ndim=2] samples = np.empty((N, 2), dtype=np.float64)</pre>\n",
        "<pre id='line21' class='code' style='background-color: #FFFF24'>\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":21\n",
        " *         double y = 0\n",
        " *         Py_ssize_t i, j\n",
        " *         np.ndarray[np.float64_t, ndim=2] samples = np.empty((N, 2), dtype=np.float64)             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " * \n",
        " *     for i in range(N):\n",
        " */\n",
        "  __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetName</span>(__pyx_m, __pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
        "  __pyx_t_2 = <span class='py_c_api'>PyObject_GetAttr</span>(__pyx_t_1, __pyx_n_s__empty);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
        "  __pyx_t_1 = <span class='py_c_api'>PyInt_FromLong</span>(__pyx_v_N);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
        "  __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
        "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_t_1);\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
        "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_2);\n",
        "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 1, __pyx_int_2);\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_2);\n",
        "  __pyx_t_1 = 0;\n",
        "  __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
        "  <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, ((PyObject *)__pyx_t_3));\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_t_3));\n",
        "  __pyx_t_3 = 0;\n",
        "  __pyx_t_3 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_3));\n",
        "  __pyx_t_4 = <span class='pyx_c_api'>__Pyx_GetName</span>(__pyx_m, __pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
        "  __pyx_t_5 = <span class='py_c_api'>PyObject_GetAttr</span>(__pyx_t_4, __pyx_n_s__float64);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
        "  if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_3, ((PyObject *)__pyx_n_s__dtype), __pyx_t_5) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
        "  __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_1), ((PyObject *)__pyx_t_3));<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
        "  <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n",
        "  if (!(likely(((__pyx_t_5) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_5, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "  __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);\n",
        "  {\n",
        "    __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
        "    if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_samples.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {\n",
        "      __pyx_v_samples = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_samples.rcbuffer->pybuffer.buf = NULL;\n",
        "     <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "    } else {__pyx_pybuffernd_samples.diminfo[0].strides = __pyx_pybuffernd_samples.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_samples.diminfo[0].shape = __pyx_pybuffernd_samples.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_samples.diminfo[1].strides = __pyx_pybuffernd_samples.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_samples.diminfo[1].shape = __pyx_pybuffernd_samples.rcbuffer->pybuffer.shape[1];\n",
        "    }\n",
        "  }\n",
        "  __pyx_t_6 = 0;\n",
        "  __pyx_v_samples = ((PyArrayObject *)__pyx_t_5);\n",
        "  __pyx_t_5 = 0;\n",
        "</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line22\")'> 22: </pre>\n",
        "<pre id='line22' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line23\")'> 23:     for i in range(N):</pre>\n",
        "<pre id='line23' class='code' style='background-color: #FFFFff'>\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":23\n",
        " *         np.ndarray[np.float64_t, ndim=2] samples = np.empty((N, 2), dtype=np.float64)\n",
        " * \n",
        " *     for i in range(N):             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *         for j in range(thin):\n",
        " *             x = random.gammavariate(3, 1.0 / (y**2 + 4))\n",
        " */\n",
        "  __pyx_t_7 = __pyx_v_N;\n",
        "  for (__pyx_t_8 = 0; __pyx_t_8 <code><</code> __pyx_t_7; __pyx_t_8+=1) {\n",
        "    __pyx_v_i = __pyx_t_8;\n",
        "</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line24\")'> 24:         for j in range(thin):</pre>\n",
        "<pre id='line24' class='code' style='background-color: #FFFFff'>\n",
        "    /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":24\n",
        " * \n",
        " *     for i in range(N):\n",
        " *         for j in range(thin):             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *             x = random.gammavariate(3, 1.0 / (y**2 + 4))\n",
        " *             y = random.gauss(1.0/(x+1), 1.0 / sqrt(2 + 2*x))\n",
        " */\n",
        "    __pyx_t_9 = __pyx_v_thin;\n",
        "    for (__pyx_t_10 = 0; __pyx_t_10 <code><</code> __pyx_t_9; __pyx_t_10+=1) {\n",
        "      __pyx_v_j = __pyx_t_10;\n",
        "</pre><pre class='line' style='background-color: #FFFF34' onclick='toggleDiv(\"line25\")'> 25:             x = random.gammavariate(3, 1.0 / (y**2 + 4))</pre>\n",
        "<pre id='line25' class='code' style='background-color: #FFFF34'>\n",
        "      /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":25\n",
        " *     for i in range(N):\n",
        " *         for j in range(thin):\n",
        " *             x = random.gammavariate(3, 1.0 / (y**2 + 4))             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *             y = random.gauss(1.0/(x+1), 1.0 / sqrt(2 + 2*x))\n",
        " *         samples[i, 0] = x\n",
        " */\n",
        "      __pyx_t_5 = <span class='pyx_c_api'>__Pyx_GetName</span>(__pyx_m, __pyx_n_s__random);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
        "      __pyx_t_3 = <span class='py_c_api'>PyObject_GetAttr</span>(__pyx_t_5, __pyx_n_s__gammavariate);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
        "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
        "      __pyx_t_5 = <span class='py_c_api'>PyFloat_FromDouble</span>((1.0 / (pow(__pyx_v_y, 2.0) + 4.0)));<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
        "      __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
        "      <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_3);\n",
        "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_int_3);\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_3);\n",
        "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 1, __pyx_t_5);\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_5);\n",
        "      __pyx_t_5 = 0;\n",
        "      __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_3, ((PyObject *)__pyx_t_1), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
        "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
        "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
        "      __pyx_t_11 = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(__pyx_t_5);<span class='error_goto'> if (unlikely((__pyx_t_11 == (double)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
        "      __pyx_v_x = __pyx_t_11;\n",
        "</pre><pre class='line' style='background-color: #FFFF30' onclick='toggleDiv(\"line26\")'> 26:             y = random.gauss(1.0/(x+1), 1.0 / sqrt(2 + 2*x))</pre>\n",
        "<pre id='line26' class='code' style='background-color: #FFFF30'>\n",
        "      /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":26\n",
        " *         for j in range(thin):\n",
        " *             x = random.gammavariate(3, 1.0 / (y**2 + 4))\n",
        " *             y = random.gauss(1.0/(x+1), 1.0 / sqrt(2 + 2*x))             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *         samples[i, 0] = x\n",
        " *         samples[i, 1] = y\n",
        " */\n",
        "      __pyx_t_5 = <span class='pyx_c_api'>__Pyx_GetName</span>(__pyx_m, __pyx_n_s__random);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
        "      __pyx_t_1 = <span class='py_c_api'>PyObject_GetAttr</span>(__pyx_t_5, __pyx_n_s__gauss);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
        "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
        "      __pyx_t_5 = <span class='py_c_api'>PyFloat_FromDouble</span>((1.0 / (__pyx_v_x + 1.0)));<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
        "      __pyx_t_3 = <span class='py_c_api'>PyFloat_FromDouble</span>((1.0 / sqrt((2.0 + (2.0 * __pyx_v_x)))));<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
        "      __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
        "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_5);\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_5);\n",
        "      <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 1, __pyx_t_3);\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_3);\n",
        "      __pyx_t_5 = 0;\n",
        "      __pyx_t_3 = 0;\n",
        "      __pyx_t_3 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
        "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
        "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n",
        "      __pyx_t_11 = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(__pyx_t_3);<span class='error_goto'> if (unlikely((__pyx_t_11 == (double)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
        "      <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
        "      __pyx_v_y = __pyx_t_11;\n",
        "    }\n",
        "</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line27\")'> 27:         samples[i, 0] = x</pre>\n",
        "<pre id='line27' class='code' style='background-color: #FFFFff'>\n",
        "    /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":27\n",
        " *             x = random.gammavariate(3, 1.0 / (y**2 + 4))\n",
        " *             y = random.gauss(1.0/(x+1), 1.0 / sqrt(2 + 2*x))\n",
        " *         samples[i, 0] = x             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *         samples[i, 1] = y\n",
        " *     return samples\n",
        " */\n",
        "    __pyx_t_10 = __pyx_v_i;\n",
        "    __pyx_t_12 = 0;\n",
        "    *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_samples.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_samples.diminfo[0].strides, __pyx_t_12, __pyx_pybuffernd_samples.diminfo[1].strides) = __pyx_v_x;\n",
        "</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line28\")'> 28:         samples[i, 1] = y</pre>\n",
        "<pre id='line28' class='code' style='background-color: #FFFFff'>\n",
        "    /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":28\n",
        " *             y = random.gauss(1.0/(x+1), 1.0 / sqrt(2 + 2*x))\n",
        " *         samples[i, 0] = x\n",
        " *         samples[i, 1] = y             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " *     return samples\n",
        " */\n",
        "    __pyx_t_13 = __pyx_v_i;\n",
        "    __pyx_t_14 = 1;\n",
        "    *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_samples.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_samples.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_samples.diminfo[1].strides) = __pyx_v_y;\n",
        "  }\n",
        "</pre><pre class='line' style='background-color: #FFFF52' onclick='toggleDiv(\"line29\")'> 29:     return samples</pre>\n",
        "<pre id='line29' class='code' style='background-color: #FFFF52'>\n",
        "  /* \"_cython_magic_47aca511be1c039cbd4a474ec757e22b.pyx\":29\n",
        " *         samples[i, 0] = x\n",
        " *         samples[i, 1] = y\n",
        " *     return samples             # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
        " */\n",
        "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
        "  <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_samples));\n",
        "  __pyx_r = ((PyObject *)__pyx_v_samples);\n",
        "  goto __pyx_L0;\n",
        "\n",
        "  __pyx_r = Py_None; <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
        "  goto __pyx_L0;\n",
        "  __pyx_L1_error:;\n",
        "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n",
        "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_2);\n",
        "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3);\n",
        "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4);\n",
        "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5);\n",
        "  { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
        "    <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
        "    <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_samples.rcbuffer->pybuffer);\n",
        "  <span class='pyx_c_api'>__Pyx_ErrRestore</span>(__pyx_type, __pyx_value, __pyx_tb);}\n",
        "  <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_47aca511be1c039cbd4a474ec757e22b.gibbs_cython\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
        "  __pyx_r = NULL;\n",
        "  goto __pyx_L2;\n",
        "  __pyx_L0:;\n",
        "  <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_samples.rcbuffer->pybuffer);\n",
        "  __pyx_L2:;\n",
        "  <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_samples);\n",
        "  <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>(__pyx_r);\n",
        "  <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
        "  return __pyx_r;\n",
        "}\n",
        "\n",
        "/* Python wrapper */\n",
        "static int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/\n",
        "static int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {\n",
        "  int __pyx_r;\n",
        "  <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
        "  <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"__getbuffer__ (wrapper)\", 0);\n",
        "  __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));\n",
        "  <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
        "  return __pyx_r;\n",
        "}\n",
        "</pre></body></html>"
       ],
       "output_type": "pyout",
       "prompt_number": 9,
       "text": [
        "<IPython.core.display.HTML at 0xcb138ec>"
       ]
      }
     ],
     "prompt_number": 9
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%timeit gibbs_cython()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1 loops, best of 3: 49 s per loop\n"
       ]
      }
     ],
     "prompt_number": 10
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Not too bad. Can we do better?\n",
      "\n",
      "* Looking at annotations: overhead associated with calling Python functions within the loop.\n",
      "* Instead, call directly C-functions.\n",
      "* GNU Scientific Library (GSL) is a **high-quality**, **wicked-fast**, and **well-tested** numerical C library.\n",
      "* CythonGSL provides a Cython interface https://github.com/twiecki/CythonGSL."
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "CythonGSL"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%cython -lgsl -lgslcblas -a\n",
      "\n",
      "cimport cython\n",
      "from cython_gsl cimport *\n",
      "\n",
      "import numpy as np\n",
      "cimport numpy as np\n",
      "\n",
      "from libc.math cimport sqrt\n",
      "\n",
      "cdef gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937)\n",
      "\n",
      "@cython.boundscheck(False)\n",
      "@cython.wraparound(False)\n",
      "@cython.cdivision(True)\n",
      "def gibbs_cythongsl(int N=20000, int thin=500):\n",
      "    cdef: \n",
      "        double x = 0\n",
      "        double y = 0\n",
      "        Py_ssize_t i, j\n",
      "        np.ndarray[np.float64_t, ndim=2] samples = np.empty((N, 2), dtype=np.float64)\n",
      "\n",
      "    for i in range(N):\n",
      "        for j in range(thin):\n",
      "            x = gsl_ran_gamma(r, 3, 1 / (y**2 + 4) )\n",
      "            y = gsl_ran_gaussian(r, sqrt(1.0 / (2+2*x) )) + 1/(1+x)\n",
      "        samples[i, 0] = x\n",
      "        samples[i, 1] = y\n",
      "    return samples"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "ename": "LinkError",
       "evalue": "Command \"gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro /home/whyking/.ipython/cython/home/whyking/.ipython/cython/_cython_magic_66e060ba8bd94b9543bb08884dcaacfc.o - l g s l - l g s l c b l a s -o /home/whyking/.ipython/cython/_cython_magic_66e060ba8bd94b9543bb08884dcaacfc.so\" failed with exit status 1",
       "output_type": "pyerr",
       "traceback": [
        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mLinkError\u001b[0m                                 Traceback (most recent call last)",
        "\u001b[1;32m<ipython-input-9-c71b94be9bfa>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_run_cached_cell_magic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mu'cython'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34mu'-lgsl -lgslcblas -a'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
        "\u001b[1;32m/home/whyking/src/ipython/IPython/core/interactiveshell.pyc\u001b[0m in \u001b[0;36m_run_cached_cell_magic\u001b[1;34m(self, magic_name, line)\u001b[0m\n\u001b[0;32m   2532\u001b[0m         \u001b[0mcell\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_current_cell_magic_body\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2533\u001b[0m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_current_cell_magic_body\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2534\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_cell_magic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmagic_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mline\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcell\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2535\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2536\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mrun_cell\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mraw_cell\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstore_history\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mFalse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msilent\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mFalse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/home/whyking/src/ipython/IPython/core/interactiveshell.pyc\u001b[0m in \u001b[0;36mrun_cell_magic\u001b[1;34m(self, magic_name, line, cell)\u001b[0m\n\u001b[0;32m   2116\u001b[0m             \u001b[0mmagic_arg_s\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvar_expand\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mline\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mstack_depth\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2117\u001b[0m             \u001b[1;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2118\u001b[1;33m                 \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmagic_arg_s\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcell\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2119\u001b[0m             \u001b[1;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2120\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/home/whyking/src/ipython/IPython/extensions/cythonmagic.py\u001b[0m in \u001b[0;36mcython\u001b[1;34m(self, line, cell)\u001b[0m\n",
        "\u001b[1;32m/home/whyking/src/ipython/IPython/core/magic.pyc\u001b[0m in \u001b[0;36m<lambda>\u001b[1;34m(f, *a, **k)\u001b[0m\n\u001b[0;32m    189\u001b[0m     \u001b[1;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    190\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 191\u001b[1;33m         \u001b[0mcall\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    192\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    193\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/home/whyking/src/ipython/IPython/extensions/cythonmagic.py\u001b[0m in \u001b[0;36mcython\u001b[1;34m(self, line, cell)\u001b[0m\n\u001b[0;32m    221\u001b[0m             \u001b[0mbuild_extension\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbuild_temp\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdirname\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpyx_file\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    222\u001b[0m             \u001b[0mbuild_extension\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbuild_lib\u001b[0m  \u001b[1;33m=\u001b[0m \u001b[0mlib_dir\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 223\u001b[1;33m             \u001b[0mbuild_extension\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    224\u001b[0m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_code_cache\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmodule_name\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    225\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/lib/python2.7/distutils/command/build_ext.pyc\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    337\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    338\u001b[0m         \u001b[1;31m# Now actually compile and link everything.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 339\u001b[1;33m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbuild_extensions\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    340\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    341\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mcheck_extensions_list\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mextensions\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/lib/python2.7/distutils/command/build_ext.pyc\u001b[0m in \u001b[0;36mbuild_extensions\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m    446\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    447\u001b[0m         \u001b[1;32mfor\u001b[0m \u001b[0mext\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mextensions\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 448\u001b[1;33m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbuild_extension\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mext\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    449\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    450\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mbuild_extension\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mext\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/lib/python2.7/distutils/command/build_ext.pyc\u001b[0m in \u001b[0;36mbuild_extension\u001b[1;34m(self, ext)\u001b[0m\n\u001b[0;32m    528\u001b[0m             \u001b[0mdebug\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    529\u001b[0m             \u001b[0mbuild_temp\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbuild_temp\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 530\u001b[1;33m             target_lang=language)\n\u001b[0m\u001b[0;32m    531\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    532\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/lib/python2.7/distutils/ccompiler.pyc\u001b[0m in \u001b[0;36mlink_shared_object\u001b[1;34m(self, objects, output_filename, output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang)\u001b[0m\n\u001b[0;32m    687\u001b[0m                   \u001b[0mlibraries\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlibrary_dirs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mruntime_library_dirs\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    688\u001b[0m                   \u001b[0mexport_symbols\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdebug\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 689\u001b[1;33m                   extra_preargs, extra_postargs, build_temp, target_lang)\n\u001b[0m\u001b[0;32m    690\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    691\u001b[0m     def link_executable(self, objects, output_progname, output_dir=None,\n",
        "\u001b[1;32m/usr/lib/python2.7/distutils/unixccompiler.pyc\u001b[0m in \u001b[0;36mlink\u001b[1;34m(self, target_desc, objects, output_filename, output_dir, libraries, library_dirs, runtime_library_dirs, export_symbols, debug, extra_preargs, extra_postargs, build_temp, target_lang)\u001b[0m\n\u001b[0;32m    261\u001b[0m                 \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mspawn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlinker\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mld_args\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    262\u001b[0m             \u001b[1;32mexcept\u001b[0m \u001b[0mDistutilsExecError\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 263\u001b[1;33m                 \u001b[1;32mraise\u001b[0m \u001b[0mLinkError\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmsg\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    264\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    265\u001b[0m             \u001b[0mlog\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"skipping %s (up-to-date)\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0moutput_filename\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;31mLinkError\u001b[0m: Command \"gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro /home/whyking/.ipython/cython/home/whyking/.ipython/cython/_cython_magic_66e060ba8bd94b9543bb08884dcaacfc.o - l g s l - l g s l c b l a s -o /home/whyking/.ipython/cython/_cython_magic_66e060ba8bd94b9543bb08884dcaacfc.so\" failed with exit status 1"
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "gcc: error: l: No such file or directory\n",
        "gcc: error: g: No such file or directory\n",
        "gcc: error: s: No such file or directory\n",
        "gcc: error: l: No such file or directory\n",
        "gcc: error: l: No such file or directory\n",
        "gcc: error: g: No such file or directory\n",
        "gcc: error: s: No such file or directory\n",
        "gcc: error: l: No such file or directory\n",
        "gcc: error: c: No such file or directory\n",
        "gcc: error: b: No such file or directory\n",
        "gcc: error: l: No such file or directory\n",
        "gcc: error: a: No such file or directory\n",
        "gcc: error: s: No such file or directory\n"
       ]
      }
     ],
     "prompt_number": 9
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Looks good, the loop is now pure C. How much faster is it?"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%timeit gibbs_cythongsl()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "ename": "NameError",
       "evalue": "global name 'gibbs_cythongsl' is not defined",
       "output_type": "pyerr",
       "traceback": [
        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
        "\u001b[1;32m<ipython-input-7-01844fe7e4b2>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmagic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34mu'timeit gibbs_cythongsl()'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
        "\u001b[1;32m/home/whyking/src/ipython/IPython/core/interactiveshell.pyc\u001b[0m in \u001b[0;36mmagic\u001b[1;34m(self, arg_s)\u001b[0m\n\u001b[0;32m   2159\u001b[0m         \u001b[0mmagic_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmagic_arg_s\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0marg_s\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpartition\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m' '\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2160\u001b[0m         \u001b[0mmagic_name\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmagic_name\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlstrip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprefilter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mESC_MAGIC\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2161\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmagic_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmagic_arg_s\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2162\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2163\u001b[0m     \u001b[1;31m#-------------------------------------------------------------------------\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/home/whyking/src/ipython/IPython/core/interactiveshell.pyc\u001b[0m in \u001b[0;36mrun_line_magic\u001b[1;34m(self, magic_name, line)\u001b[0m\n\u001b[0;32m   2085\u001b[0m                 \u001b[0mkwargs\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'local_ns'\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msys\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getframe\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mstack_depth\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mf_locals\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2086\u001b[0m             \u001b[1;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2087\u001b[1;33m                 \u001b[0mresult\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2088\u001b[0m             \u001b[1;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2089\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/home/whyking/src/ipython/IPython/core/magics/execution.pyc\u001b[0m in \u001b[0;36mtimeit\u001b[1;34m(self, line, cell)\u001b[0m\n",
        "\u001b[1;32m/home/whyking/src/ipython/IPython/core/magic.pyc\u001b[0m in \u001b[0;36m<lambda>\u001b[1;34m(f, *a, **k)\u001b[0m\n\u001b[0;32m    189\u001b[0m     \u001b[1;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    190\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 191\u001b[1;33m         \u001b[0mcall\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mk\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    192\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    193\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/home/whyking/src/ipython/IPython/core/magics/execution.pyc\u001b[0m in \u001b[0;36mtimeit\u001b[1;34m(self, line, cell)\u001b[0m\n\u001b[0;32m    793\u001b[0m             \u001b[0mnumber\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    794\u001b[0m             \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 795\u001b[1;33m                 \u001b[1;32mif\u001b[0m \u001b[0mtimer\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m>=\u001b[0m \u001b[1;36m0.2\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    796\u001b[0m                     \u001b[1;32mbreak\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    797\u001b[0m                 \u001b[0mnumber\u001b[0m \u001b[1;33m*=\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m/usr/lib/python2.7/timeit.pyc\u001b[0m in \u001b[0;36mtimeit\u001b[1;34m(self, number)\u001b[0m\n\u001b[0;32m    193\u001b[0m         \u001b[0mgc\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    194\u001b[0m         \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 195\u001b[1;33m             \u001b[0mtiming\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0minner\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mit\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    196\u001b[0m         \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    197\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
        "\u001b[1;32m<magic-timeit>\u001b[0m in \u001b[0;36minner\u001b[1;34m(_it, _timer)\u001b[0m\n",
        "\u001b[1;31mNameError\u001b[0m: global name 'gibbs_cythongsl' is not defined"
       ]
      }
     ],
     "prompt_number": 7
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from numba import autojit, jit, random\n",
      "import numpy as np\n",
      "import math\n",
      "\n",
      "state = random.state_p\n",
      "\n",
      "@jit('f8[:,:](int64, int32)')\n",
      "def gibbs_numba(N, thin):\n",
      "    x = 0\n",
      "    y = 0\n",
      "    samples = np.empty((N, 2))\n",
      "    for i in range(N):\n",
      "        for j in range(thin):\n",
      "            x = random.rk_gamma(state, 3, 1.0/(y**2+4))\n",
      "            y = random.rk_normal(state, 1.0/(x+1), 1.0/math.sqrt(2+2*x))\n",
      "\n",
      "        samples[i, 0] = x\n",
      "        samples[i, 1] = y\n",
      "\n",
      "    return samples"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%timeit gibbs_numba(20000, 500)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "1 loops, best of 3: 2.73 s per loop\n"
       ]
      }
     ],
     "prompt_number": 10
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numba\n",
      "\n",
      "from ctypes import CDLL, RTLD_GLOBAL\n",
      "import numpy as np\n",
      "\n",
      "libgslcblas = CDLL('libgslcblas.so', mode=RTLD_GLOBAL)\n",
      "libgsl = CDLL('libgsl.so')\n",
      "\n",
      "@numba.jit('double[:,:](int64,int64)')\n",
      "def gibbs_numba(N, thin):\n",
      "    r = libgsl.gsl_rng_alloc(libgsl.gsl_rng_mt19937)\n",
      "    x = 0\n",
      "    y = 0\n",
      "    samples = np.empty((N, 2), dtype=np.float64)\n",
      "\n",
      "    for i in range(N):\n",
      "        for j in range(thin):\n",
      "            x = libgsl.gsl_ran_gamma(r, 3, 1 / (y**2 + 4) )\n",
      "            y = libgsl.gsl_ran_gaussian(r, sqrt(1.0 / (2+2*x) )) + 1/(1+x)\n",
      "        samples[i, 0] = x\n",
      "        samples[i, 1] = y\n",
      "    return samples"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 4
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "r = gibbs_numba(20000, 500)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": "*"
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numba\n",
      "print numba.__version__"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "843ea49\n"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Speed overview"
     ]
    },
    {
     "cell_type": "raw",
     "metadata": {},
     "source": [
      "    | Python | NumPy | Cython | CythonGSL |\n",
      "----+--------+-------+--------+-----------|\n",
      "abs |  60s   |  60s  |   50s  |    2.6s   |\n",
      "rel |   1    |   1   |   1.2  |    ~24    |"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "CythonGSL provides a Cython interface for the GNU Scientific Library (GSL).\n",
      "\n",
      "Cython is the ideal tool to speed up numerical computations by converting typed Python code to C and generating Python wrappers so that these compiled functions can be called from Python. Scientific programming often requires use of various numerical routines (e.g. numerical integration, optimization). While SciPy provides many of those tools, there is an overhead associated with using these functions within your Cython code. CythonGSL allows you to shave off that last layer by providing Cython declarations for the GSL which allow you to use this high-quality library from within Cython without any Python overhead.\n",
      "\n",
      "For more info and code, see https://github.com/twiecki/CythonGSL"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "GSL functionality\n",
      "=================\n",
      "\n",
      "* Complex Numbers\t\n",
      "* Roots of Polynomials\n",
      "* Special Functions\t\n",
      "* Vectors and Matrices\n",
      "* Permutations\t\n",
      "* Sorting\n",
      "* BLAS Support\t\n",
      "* Linear Algebra\n",
      "* Eigensystems\t\n",
      "* Fast Fourier \n",
      "* Transforms\n",
      "* **Quadrature**\n",
      "* Random Numbers\n",
      "* Quasi-Random Sequences\t\n",
      "* Random Distributions\n",
      "* Statistics\t\n",
      "* Histograms\n",
      "* N-Tuples\t\n",
      "* Monte Carlo Integration\n",
      "* Simulated Annealing\t\n",
      "* Differential Equations\n",
      "* Interpolation\t\n",
      "* **Numerical Differentiation**\n",
      "* Chebyshev Approximation\t\n",
      "* Series Acceleration\n",
      "* Discrete Hankel Transforms\t\n",
      "* Root-Finding\n",
      "* **Minimization**\n",
      "* Least-Squares Fitting\n",
      "* Physical Constants\t\n",
      "* IEEE Floating-Point\n",
      "* Discrete Wavelet Transforms\t\n",
      "* Basis splines"
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Example: Numerical Integration"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%%cython -lgsl -lgslcblas\n",
      "\n",
      "from cython_gsl cimport *\n",
      "\n",
      "ctypedef double * double_ptr\n",
      "ctypedef void * void_ptr\n",
      "\n",
      "cdef double normal(double x, void * params) nogil:\n",
      "    cdef double mu = (<double_ptr> params)[0]\n",
      "    cdef double sigma = (<double_ptr> params)[1]\n",
      "\n",
      "    return gsl_ran_gaussian_pdf(x - mu, sigma)\n",
      "\n",
      "def cdf_numerical(double x, double mu, double sigma):\n",
      "    cdef double alpha, result, error, expected\n",
      "    cdef gsl_integration_workspace * W\n",
      "    W = gsl_integration_workspace_alloc(1000)\n",
      "    cdef gsl_function F\n",
      "    cdef double params[1]\n",
      "    cdef size_t neval\n",
      "\n",
      "    params[0] = mu\n",
      "    params[1] = sigma\n",
      "\n",
      "    F.function = &normal\n",
      "    F.params = params\n",
      "\n",
      "    gsl_integration_qag(&F, -10, x, 1e-2, 1e-2, 1000, GSL_INTEG_GAUSS15, W, &result, &error)\n",
      "    gsl_integration_workspace_free(W)\n",
      "\n",
      "    return result"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 13
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Easy compilation\n",
      "----------------"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from distutils.core import setup\n",
      "from Cython.Distutils import Extension\n",
      "from Cython.Distutils import build_ext\n",
      "import cython_gsl\n",
      "\n",
      "setup(\n",
      "    [...]\n",
      "    include_dirs = [cython_gsl.get_include()],\n",
      "    cmdclass = {'build_ext': build_ext},\n",
      "    ext_modules = [Extension(\"my_cython_script\",\n",
      "\t\t\t [\"src/my_cython_script.pyx\"],\n",
      "             libraries=cython_gsl.get_libraries(),\n",
      "\t\t\t library_dirs=[cython_gsl.get_library_dir()],\n",
      "             include_dirs=[cython_gsl.get_cython_include_dir()])]\n",
      ")"
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Credits\n",
      "=======\n",
      "\n",
      "Examples based on Gibbs sampler explored in various blog posts:\n",
      "http://pyinsci.blogspot.com/2010/12/efficcient-mcmc-in-python.html\n",
      "https://darrenjw.wordpress.com/2011/07/16/gibbs-sampler-in-various-languages-revisited/\n",
      "\n",
      "CythonGSL is a fork of PyrexGsl by Mario Pernici: http://wwwteor.mi.infn.it/~pernici/pyrexgsl/pyrexgsl.html"
     ]
    }
   ],
   "metadata": {}
  }
 ]
}